%% copy riak-0.14.2 source to learn dynamo implementation and erlang
%% author: lichuang
%% copy source from riak_core_handoff_listener.erl

%% riak_handoff_listener: entry point for TCP-based handoff
-module(edynamo_handoff_listener).
-behavior(gen_nb_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
         terminate/2, code_change/3]).
-export([sock_opts/0, new_connection/2]).
-record(state, {portnum}).

start_link() ->
  PortNum = app_helper:get_env(edynamo, handoff_port),
  IpAddr  = app_helper:get_env(edynamo, handoff_ip),
  gen_nb_server:start_link(?MODULE, IpAddr, PortNum, [PortNum]).

init([PortNum]) ->
  register(?MODULE, self()),
  edynamo_process_proxy:start_link(edyamo_kv_handoff_listener, ?MODULE),
  {ok, #state{portnum = PortNum}}.

sock_opts() ->
  [binary, {packet, 4}, {reuseaddr, true}, {backlog, 64}].

handle_call(handoff_port, _From, State=#state{portnum = P}) ->
  {reply, {ok, P}, State}.

handle_cast(_Msg, State) ->
  {noreply, State}.

handle_info(_Info, State) -> {noreply, State}.

terminate(_Reason, _State) -> ok.

code_change(_OldVsn, State, _Extra) -> {ok, State}.

new_connection(Socket, State) ->
  {ok, Pid} = edynamo_handoff_receiver:start_link(),
  gen_tcp:controlling_process(Socket, Pid),
  ok = edynamo_handoff_receiver:set_socket(Pid, Socket),
  {ok, State}.
